#ifndef __WIZ_BASE_TEMPLATE_TYPEMINMAX_HPP__SHANHAOBO_19800429__
#define __WIZ_BASE_TEMPLATE_TYPEMINMAX_HPP__SHANHAOBO_19800429__

#include "../../Config/WizConfig.hpp"
#include "../Core/WizBaseCoreTypeInt.hpp"
#include "../Core/WizBaseCoreTypeReal.hpp"

namespace Wiz
{
    template<class T>
    WIZ_INLINE T GetMin();
    template<class T>
    WIZ_INLINE T GetMax();

    ////////////////////////////////////////////////

    template<>
    WIZ_INLINE ::Wiz::Real32::Type GetMin<::Wiz::Real32::Type>()
    {
        return ::Wiz::Real32::Min;
    }
    template<>
    WIZ_INLINE ::Wiz::Real64::Type GetMax<::Wiz::Real64::Type>()
    {
        return ::Wiz::Real64::Max;
    }

    ////////////////////////////////////////////////

    template<>
    WIZ_INLINE ::Wiz::Int8::Type GetMin<::Wiz::Int8::Type>()
    {
        return ::Wiz::Int8::Min;
    }
    template<>
    WIZ_INLINE ::Wiz::Int8::Type GetMax<::Wiz::Int8::Type>()
    {
        return ::Wiz::Int8::Max;
    }

    ////////////////////////////////////////////////

    template<>
    WIZ_INLINE ::Wiz::Int16::Type GetMin<::Wiz::Int16::Type>()
    {
        return ::Wiz::Int16::Min;
    }
    template<>
    WIZ_INLINE ::Wiz::Int16::Type GetMax<::Wiz::Int16::Type>()
    {
        return ::Wiz::Int16::Max;
    }

    ////////////////////////////////////////////////

    template<>
    WIZ_INLINE ::Wiz::Int32::Type GetMin<::Wiz::Int32::Type>()
    {
        return ::Wiz::Int32::Min;
    }
    template<>
    WIZ_INLINE ::Wiz::Int32::Type GetMax<::Wiz::Int32::Type>()
    {
        return ::Wiz::Int32::Max;
    }

    ////////////////////////////////////////////////

    template<>
    WIZ_INLINE ::Wiz::Int64::Type GetMin<::Wiz::Int64::Type>()
    {
        return ::Wiz::Int64::Min;
    }
    template<>
    WIZ_INLINE ::Wiz::Int64::Type GetMax<::Wiz::Int64::Type>()
    {
        return ::Wiz::Int64::Max;
    }

    ////////////////////////////////////////////////

    template<>
    WIZ_INLINE ::Wiz::UInt8::Type GetMin<::Wiz::UInt8::Type>()
    {
        return ::Wiz::UInt8::Min;
    }
    template<>
    WIZ_INLINE ::Wiz::UInt8::Type GetMax<::Wiz::UInt8::Type>()
    {
        return ::Wiz::UInt8::Max;
    }

    template<>
    WIZ_INLINE ::Wiz::UInt16::Type GetMin<::Wiz::UInt16::Type>()
    {
        return ::Wiz::UInt16::Min;
    }
    template<>
    WIZ_INLINE ::Wiz::UInt16::Type GetMax<::Wiz::UInt16::Type>()
    {
        return ::Wiz::UInt16::Max;
    }

    template<>
    WIZ_INLINE ::Wiz::UInt32::Type GetMin<::Wiz::UInt32::Type>()
    {
        return ::Wiz::UInt32::Min;
    }
    template<>
    WIZ_INLINE ::Wiz::UInt32::Type GetMax<::Wiz::UInt32::Type>()
    {
        return ::Wiz::UInt32::Max;
    }

    template<>
    WIZ_INLINE ::Wiz::UInt64::Type GetMin<::Wiz::UInt64::Type>()
    {
        return ::Wiz::UInt64::Min;
    }
    template<>
    WIZ_INLINE ::Wiz::UInt64::Type GetMax<::Wiz::UInt64::Type>()
    {
        return ::Wiz::UInt64::Max;
    }

    template<class T>
    struct IntMinMax
    {
    };

#   define WIZ_TEMP_MIN_MAX(path)                   \
    template<>                                      \
    struct IntMinMax<path::Type>                    \
    {                                               \
        static const path::Type Min = path::Min;    \
        static const path::Type Max = path::Max;    \
    };

    WIZ_TEMP_MIN_MAX(::Wiz::Int8);
    WIZ_TEMP_MIN_MAX(::Wiz::UInt8);
    WIZ_TEMP_MIN_MAX(::Wiz::Int16);
    WIZ_TEMP_MIN_MAX(::Wiz::UInt16);
    WIZ_TEMP_MIN_MAX(::Wiz::Int32);
    WIZ_TEMP_MIN_MAX(::Wiz::UInt32);
    WIZ_TEMP_MIN_MAX(::Wiz::Int64);
    WIZ_TEMP_MIN_MAX(::Wiz::UInt64);
    //WIZ_TEMP_MIN_MAX(::Wiz::Real32, ::Wiz::Real32::Type);
    //WIZ_TEMP_MIN_MAX(::Wiz::Real64, ::Wiz::Real64::Type);

#   undef WIZ_TEMP_MIN_MAX
} /// end of namespace Wiz

#endif /*__WIZ_BASE_TEMPLATE_TYPEMINMAX_HPP__SHANHAOBO_19800429__*/
